package org.dromara.common.core.domain.dto

import java.io.Serial
import java.io.Serializable
import java.util.*
import java.util.function.Function
import java.util.stream.Collectors

/**
 * 任务受让人
 *
 * @author LikeYouDo
 * @date 2025/09/22
 */
data class TaskAssigneeDTO(
    /**
     * 总大小
     */
    var total: Long = 0L,

    /**
     *
     */
    var list: MutableList<TaskHandler>? = null
) : Serializable {
    companion object {
        @Serial
        private const val serialVersionUID = 1L

        /**
         * 将源列表转换为 TaskHandler 列表
         *
         * @param T              通用类型
         * @param sourceList       待转换的源列表
         * @param storageId        提取 storageId 的函数
         * @param handlerCode      提取 handlerCode 的函数
         * @param handlerName      提取 handlerName 的函数
         * @param groupName        提取 groupName 的函数
         * @param createTimeMapper 提取 createTime 的函数
         * @return 转换后的 TaskHandler 列表
         */
        @JvmStatic
        fun <T> convertToHandlerList(
            sourceList: MutableList<T?>,
            storageId: Function<T?, String?>,
            handlerCode: Function<T?, String?>,
            handlerName: Function<T?, String?>,
            groupName: Function<T?, String?>,
            createTimeMapper: Function<T?, Date?>
        ): MutableList<TaskHandler?> {
            return sourceList.stream()
                .map { item: T? ->
                    TaskHandler(
                        storageId.apply(item),
                        handlerCode.apply(item),
                        handlerName.apply(item),
                        groupName.apply(item),
                        createTimeMapper.apply(item)
                    )
                }.collect(Collectors.toList())
        }
    }

    class TaskHandler (
        /**
         * 主键
         */
        var storageId: String? = null,

        /**
         * 权限编码
         */
        var handlerCode: String? = null,

        /**
         * 权限名称
         */
        var handlerName: String? = null,

        /**
         * 权限分组
         */
        var groupName: String? = null,

        /**
         * 创建时间
         */
        var createTime: Date? = null,
    )
}
